Circuit designs for integrated circuits (ICs) can be generated using a variety of techniques. In some examples, designers can write register-transfer level (RTL) code, write program-language code, create schematic representations, or a combination thereof to design a circuit for implementation in a target IC device. The target IC device can be a programmable IC, such as a field programmable gate array (FPGA), a mask-programmable IC, such as an application specific integrated circuit (ASIC), or the like. In the design flow, a designer creates a description of the circuit design, which is then processed through one or more steps that transform the description into a physical implementation of the circuit design for a target IC device.
In some design flows, each time a user changes a circuit design, the user must restart the implementation of the modified circuit design from the beginning. Other design flows attempt to reuse a previous implementation to “seed” a new implementation. The seed or guidance, however, is often not reliable and the design flow can actually take longer to implement the changed circuit design than it would otherwise. Still other design flows allow a user to manually divide the design into different portions, and then attempt to reuse implemented portions in subsequent implementations of the circuit design. Manual design partitioning exhibits higher flow complexity. Moreover, such design flows lack strong isolation of circuit blocks, and thus incremental changes in one circuit block can cascade throughout the circuit design. The propagation of incremental changes throughout the circuit design leads to nearly complete or complete re-implementation of the circuit design.